package application.services;

import application.exceptions.ItemNotFoundException;
import application.model.ProducentsModel;
import application.model.modify.ProducentModel;
import application.translators.Translator;
import application.translators.impl.ProducentsTranslator;
import dao.ProducentsDao;
import mappings.Producent;
import org.hibernate.exception.ConstraintViolationException;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List;

@Path("producents")
public class ProducentService
{
    private ProducentsDao producentsDao = new ProducentsDao();
    private Translator<List<Producent>, ProducentsModel> translator = new ProducentsTranslator();

    /*
     * Zwraca wszystkich producentow w postaci XML
     */
    @Path("getAllProducents")
    @GET
    @Produces(MediaType.APPLICATION_XML)
    public ProducentsModel getAllProducents()
    {
        ProducentsModel producents = translator.translate(producentsDao.getAllProducents());

        return producents;
    }

    @Path("addProducent")
    @POST
    @Produces(MediaType.APPLICATION_XML)
    public ProducentModel addNewProducent(@FormParam("name") String name)
    {
        ProducentModel producentModel = new ProducentModel();

        try
        {
            Producent producent = producentsDao.addProducent(name);
            producentModel.setId(producent.getId());
            producentModel.setName(producent.getName());
            producentModel.setStatus(0);
        }
        catch (ConstraintViolationException e)
        {
            // lapiemy wyjatek rzucany przez hibernate'a dla unique constraint - ustawiamy status 1 (rekord istnieje)
            producentModel.setStatus(1);
        }
        catch (Exception e)
        {
            // lapiemy wszystkie inne exceptiony i ustawiamy status na 2 (czyli cos sie wyjebalo, ale nie wiadomo co :P)
            producentModel.setStatus(2);
        }

        return producentModel;
    }

    @Path("editProducent")
    @POST
    @Produces(MediaType.APPLICATION_XML)
    public ProducentModel editProducent(@FormParam("id") Integer id, @FormParam("name") String name)
    {
        ProducentModel producentModel = new ProducentModel();

        try
        {
            Producent producent = producentsDao.editProducent(id, new Producent(name));
            producentModel.setName(producent.getName());
            producentModel.setId(producent.getId());
            producentModel.setStatus(0);
        }
        catch (ItemNotFoundException e)
        {
            producentModel.setStatus(1); // 1 = nie znaleziono rekordu o danym id
        }
        catch (Exception e)
        {
            producentModel.setStatus(2);
        }

        return producentModel;
    }

    @Path("deleteProducent")
    @POST
    @Produces(MediaType.APPLICATION_XML)
    public ProducentModel deleteProducent(@FormParam("id") Integer id)
    {
        ProducentModel producentModel = new ProducentModel();

        try
        {
            producentsDao.deleteProducent(id);
            producentModel.setStatus(0);
        }
        catch (ItemNotFoundException e)
        {
            producentModel.setStatus(1); // 1 = nie znaleziono rekordu o danym id
        }
        catch (Exception e)
        {
            producentModel.setStatus(2);
        }

        return producentModel;
    }
}
